﻿using Marmat.Forms.Skin;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;

namespace Marmat.Forms.Win32API
{
    /// <summary>
    /// win32的API处理函数
    /// </summary>
    public sealed class User32
    {
        /// <summary>
        /// 检索滚动条的参数,包括最小和最大滚动位置、页面大小和滚动框（拇指）的位置.
        /// </summary>
        /// <param name="hwnd">处理滚动条控件或窗口的一个标准的滚动条,根据不同的fnBar参数值.</param>
        /// <param name="fnBar">指定要检索的参数为滚动条的类型.此参数可以是下列值之一.</param>
        /// <param name="lpsi">指向SCROLLINFO结构.在调用GetScrollInfo,设置cbSize成员SIZEOF（SCROLLINFO）,并设置fMask成员指定要检索的滚动条参数.返回之前,函数将指定的参数复制到结构的适当成员.</param>
        /// <returns></returns>
        [DllImport("user32.dll", EntryPoint = "GetScrollInfo")]
        internal static extern bool GetScrollInfo(IntPtr hwnd, int fnBar, ref Scrollinfo lpsi);

        /// <summary>
        /// 设置滚动条的参数,包括最小和最大滚动位置、页面大小和滚动框的位置（拇指）.功能也重画滚动条
        /// </summary>
        /// <param name="hwnd"></param>
        /// <param name="fnBar"></param>
        /// <param name="lpsi"></param>
        /// <param name="fRedraw"></param>
        /// <returns></returns>
        [DllImport("user32.dll", EntryPoint = "SetScrollInfo")]
        internal static extern int SetScrollInfo(IntPtr hwnd, int fnBar, [In] ref Scrollinfo lpsi, bool fRedraw);

        /// <summary>
        /// 将指定的消息发送到一个或多个窗口，为指定的窗口调用窗口程序，直到窗口程序处理完消息再返回。
        /// </summary>
        /// <param name="hWnd"></param>
        /// <param name="Msg"></param>
        /// <param name="wParam"></param>
        /// <param name="lParam"></param>
        /// <returns></returns>
        [DllImport("User32.dll", CharSet = CharSet.Auto, EntryPoint = "SendMessage")]
        internal static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

        /// <summary>
        /// 该函数在属于当前线程的指定窗口里设置鼠标捕获。一旦窗口捕获了鼠标，所有鼠标输入都针对该窗口，无论光标是否在窗口的边界内。同一时刻只能有一个窗口捕获鼠标。如果鼠标光标在另一个线程创建的窗口上，只有当鼠标键按下时系统才将鼠标输入指向指定的窗口。
        /// </summary>
        /// <param name="h"></param>
        /// <returns></returns>
        [DllImport("user32.dll")]
        internal static extern IntPtr SetCapture(IntPtr h);

        /// <summary>
        /// 从当前线程中的窗口释放鼠标捕获，并恢复通常的鼠标输入处理。
        /// </summary>
        /// <returns></returns>
        [DllImport("user32.dll")]
        internal static extern bool ReleaseCapture();

        /// <summary>
        /// 返回hWnd参数所指定的窗口的设备环境。
        /// </summary>
        /// <param name="hwnd"></param>
        /// <returns></returns>
        [DllImport("User32.dll")]
        internal static extern IntPtr GetWindowDC(IntPtr hwnd);

        /// <summary>
        /// 释放设备上下文环境(DC)供其他应用程序使用。函数的效果与设备上下文环境类型有关。它只释放公用的和设备上下文环境，对于类或私有的则无效。
        /// </summary>
        /// <param name="hwnd"></param>
        /// <param name="hdc"></param>
        /// <returns></returns>
        [DllImport("user32")]
        internal static extern int ReleaseDC(int hwnd, int hdc);
    }
}
